

<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>硬件监控 &mdash; Ceph Documentation</title>
  

  
  <link rel="stylesheet" href="../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../_static/graphviz.css" type="text/css" />
  <link rel="stylesheet" href="../_static/css/custom.css" type="text/css" />

  
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
        <script src="../_static/jquery.js"></script>
        <script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
        <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
        <script src="../_static/doctools.js"></script>
        <script src="../_static/sphinx_highlight.js"></script>
    
    <script type="text/javascript" src="../_static/js/theme.js"></script>

    
    <link rel="index" title="Index" href="../genindex/" />
    <link rel="search" title="Search" href="../search/" />
    <link rel="next" title="Ceph 术语" href="../glossary/" />
    <link rel="prev" title="Vulnerability Management Process" href="../security/process/" /> 
</head>

<body class="wy-body-for-nav">

   
  <header class="top-bar">
    <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../" class="icon icon-home" aria-label="Home"></a></li>
      <li class="breadcrumb-item active">硬件监控</li>
      <li class="wy-breadcrumbs-aside">
            <a href="../_sources/hardware-monitoring/index.rst.txt" rel="nofollow"> View page source</a>
      </li>
  </ul>
  <hr/>
</div>
  </header>
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #eee" >
          

          
            <a href="../" class="icon icon-home"> Ceph
          

          
          </a>

          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../search/" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../start/">Ceph 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../install/">安装 Ceph</a></li>
<li class="toctree-l1"><a class="reference internal" href="../cephadm/">Cephadm</a></li>
<li class="toctree-l1"><a class="reference internal" href="../rados/">Ceph 存储集群</a></li>
<li class="toctree-l1"><a class="reference internal" href="../cephfs/">Ceph 文件系统</a></li>
<li class="toctree-l1"><a class="reference internal" href="../rbd/">Ceph 块设备</a></li>
<li class="toctree-l1"><a class="reference internal" href="../radosgw/">Ceph 对象网关</a></li>
<li class="toctree-l1"><a class="reference internal" href="../mgr/">Ceph 管理器守护进程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../mgr/dashboard/">Ceph 仪表盘</a></li>
<li class="toctree-l1"><a class="reference internal" href="../monitoring/">监控概览</a></li>
<li class="toctree-l1"><a class="reference internal" href="../api/">API 文档</a></li>
<li class="toctree-l1"><a class="reference internal" href="../architecture/">体系结构</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev/developer_guide/">开发者指南</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dev/internals/">Ceph 内幕</a></li>
<li class="toctree-l1"><a class="reference internal" href="../governance/">项目管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="../foundation/">Ceph 基金会</a></li>
<li class="toctree-l1"><a class="reference internal" href="../ceph-volume/">ceph-volume</a></li>
<li class="toctree-l1"><a class="reference internal" href="../releases/general/">Ceph 版本（总目录）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../releases/">Ceph 版本（索引）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../security/">Security</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">硬件监控</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id2">必备条件</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">代理的部署</a></li>
<li class="toctree-l2"><a class="reference internal" href="#cli">CLI</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id4">实例</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#id5">硬件健康状态概况</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id6">存储设备报告</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id7">固件详情</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id8">硬件严重警告报告</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id9">开发资料</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.__init__"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.__init__()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.oob"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.oob()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.data"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.data()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.fullreport"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.fullreport()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.summary"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.summary()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.criticals"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.criticals()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.memory"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.memory()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.storage"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.storage()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.network"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.network()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.power"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.power()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.processors"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.processors()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.fans"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.fans()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.firmwares"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.firmwares()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephadm.agent.NodeProxyEndpoint.led"><code class="docutils literal notranslate"><span class="pre">NodeProxyEndpoint.led()</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../glossary/">Ceph 术语</a></li>
<li class="toctree-l1"><a class="reference internal" href="../jaegertracing/">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../translation_cn/">中文版翻译资源</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../">Ceph</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
<div id="dev-warning" class="admonition note">
  <p class="first admonition-title">Notice</p>
  <p class="last">This document is for a development version of Ceph.</p>
</div>
  <div id="docubetter" align="right" style="padding: 5px; font-weight: bold;">
    <a href="https://pad.ceph.com/p/Report_Documentation_Bugs">Report a Documentation Bug</a>
  </div>

  
  <section id="hardware-monitoring">
<span id="id1"></span><h1>硬件监控<a class="headerlink" href="#hardware-monitoring" title="Permalink to this heading"></a></h1>
<p><cite>node-proxy</cite> 是一个内部名称，用于指定运行中的代理，该代理负责清点机器的硬件、
报告各种状态、还能让操作员执行某些操作。它通过 RedFish API 收集详细信息、
处理数据并将数据推送到 Ceph 管理器守护进程中的代理终结点。</p>
<div class="graphviz"><object data="../_images/graphviz-2374644ee1d02c6ca7f2ce255181184bf6e8920d.svg" type="image/svg+xml" class="graphviz">
<p class="warning">digraph G {
    node [shape=record];
    mgr [label=&quot;{&lt;mgr&gt; ceph manager}&quot;];
    dashboard [label=&quot;&lt;dashboard&gt; ceph dashboard&quot;];
    agent [label=&quot;&lt;agent&gt; agent&quot;];
    redfish [label=&quot;&lt;redfish&gt; redfish&quot;];

    agent -&gt; redfish [label=&quot; 1.&quot; color=green];
    agent -&gt; mgr [label=&quot; 2.&quot; color=orange];
    dashboard:dashboard -&gt; mgr [label=&quot; 3.&quot;color=lightgreen];
    node [shape=plaintext];
    legend [label=&lt;&lt;table border=&quot;0&quot; cellborder=&quot;1&quot; cellspacing=&quot;0&quot;&gt;
        &lt;tr&gt;&lt;td bgcolor=&quot;lightgrey&quot;&gt;图例&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td align=&quot;center&quot;&gt;1. 通过 redfish API 收集数据&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2. 把数据推送到 ceph mgr&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td align=&quot;left&quot;&gt;3. 查询 ceph mgr&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;&gt;];
}</p></object></div>
<section id="id2">
<h2>必备条件<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h2>
<p>目前， <cite>node-proxy</cite> 代理依赖于 RedFish API 。这意味着
<cite>node-proxy</cite> 代理和 <cite>ceph-mgr</cite> 守护进程都需要接入带外网络才能工作。</p>
</section>
<section id="id3">
<h2>代理的部署<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h2>
<div class="line-block">
<div class="line">第一步就是提供带外管理工具的凭证。</div>
<div class="line">在向服务规范文件里添加主机的时候可以写上凭证。</div>
</div>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># cat host.yml</span>
---
service_type:<span class="w"> </span>host
hostname:<span class="w"> </span>node-10
addr:<span class="w"> </span><span class="m">10</span>.10.10.10
oob:
<span class="w">  </span>addr:<span class="w"> </span><span class="m">20</span>.20.20.10
<span class="w">  </span>username:<span class="w"> </span>admin
<span class="w">  </span>password:<span class="w"> </span>p@ssword
</pre></div>
</div>
<p>应用此规范：</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># ceph orch apply -i host.yml</span>
Added<span class="w"> </span>host<span class="w"> </span><span class="s1">&#39;node-10&#39;</span><span class="w"> </span>with<span class="w"> </span>addr<span class="w"> </span><span class="s1">&#39;10.10.10.10&#39;</span>
</pre></div>
</div>
<p>部署此代理：</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># ceph config set mgr mgr/cephadm/hw_monitoring true</span>
</pre></div>
</div>
</section>
<section id="cli">
<h2>CLI<a class="headerlink" href="#cli" title="Permalink to this heading"></a></h2>
<div class="line-block">
<div class="line"><strong>orch</strong> <strong>hardware</strong> <strong>status</strong> [hostname] [--category CATEGORY] [--format plain | json]</div>
</div>
<p>支持的类别（ category ）有：</p>
<ul class="simple">
<li><p>summary (default)</p></li>
<li><p>memory</p></li>
<li><p>storage</p></li>
<li><p>processors</p></li>
<li><p>network</p></li>
<li><p>power</p></li>
<li><p>fans</p></li>
<li><p>firmwares</p></li>
<li><p>criticals</p></li>
</ul>
<section id="id4">
<h3>实例<a class="headerlink" href="#id4" title="Permalink to this heading"></a></h3>
<section id="id5">
<h4>硬件健康状态概况<a class="headerlink" href="#id5" title="Permalink to this heading"></a></h4>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># ceph orch hardware status</span>
+------------+---------+-----+-----+--------+-------+------+
<span class="p">|</span><span class="w">    </span>HOST<span class="w">    </span><span class="p">|</span><span class="w"> </span>STORAGE<span class="w"> </span><span class="p">|</span><span class="w"> </span>CPU<span class="w"> </span><span class="p">|</span><span class="w"> </span>NET<span class="w"> </span><span class="p">|</span><span class="w"> </span>MEMORY<span class="w"> </span><span class="p">|</span><span class="w"> </span>POWER<span class="w"> </span><span class="p">|</span><span class="w"> </span>FANS<span class="w"> </span><span class="p">|</span>
+------------+---------+-----+-----+--------+-------+------+
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w">    </span>ok<span class="w">   </span><span class="p">|</span><span class="w">  </span>ok<span class="w"> </span><span class="p">|</span><span class="w">  </span>ok<span class="w"> </span><span class="p">|</span><span class="w">   </span>ok<span class="w">   </span><span class="p">|</span><span class="w">   </span>ok<span class="w">  </span><span class="p">|</span><span class="w">  </span>ok<span class="w">  </span><span class="p">|</span>
+------------+---------+-----+-----+--------+-------+------+
</pre></div>
</div>
</section>
<section id="id6">
<h4>存储设备报告<a class="headerlink" href="#id6" title="Permalink to this heading"></a></h4>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># ceph orch hardware status IBM-Ceph-1 --category storage</span>
+------------+--------------------------------------------------------+------------------+----------------+----------+----------------+--------+---------+
<span class="p">|</span><span class="w">    </span>HOST<span class="w">    </span><span class="p">|</span><span class="w">                          </span>NAME<span class="w">                          </span><span class="p">|</span><span class="w">      </span>MODEL<span class="w">       </span><span class="p">|</span><span class="w">      </span>SIZE<span class="w">      </span><span class="p">|</span><span class="w"> </span>PROTOCOL<span class="w"> </span><span class="p">|</span><span class="w">       </span>SN<span class="w">       </span><span class="p">|</span><span class="w"> </span>STATUS<span class="w"> </span><span class="p">|</span><span class="w">  </span>STATE<span class="w">  </span><span class="p">|</span>
+------------+--------------------------------------------------------+------------------+----------------+----------+----------------+--------+---------+
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT99QLL<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT98ZYX<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT98ZWB<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT98ZC9<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT9903Y<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT9901E<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT98ZQJ<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT99PA2<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT99PFG<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">0</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>MZ7L33T8HBNAAD3<span class="w">  </span><span class="p">|</span><span class="w"> </span><span class="m">3840755981824</span><span class="w">  </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w"> </span>S6M5NE0T800539<span class="w"> </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">0</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>MZ7L33T8HBNAAD3<span class="w">  </span><span class="p">|</span><span class="w"> </span><span class="m">3840755981824</span><span class="w">  </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w"> </span>S6M5NE0T800554<span class="w"> </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">6</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT98ZER<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT98ZEJ<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w"> </span>Disk<span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>Backplane<span class="w"> </span><span class="m">1</span><span class="w"> </span>of<span class="w"> </span>Storage<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>Slot<span class="w"> </span><span class="m">2</span><span class="w">  </span><span class="p">|</span><span class="w"> </span>ST20000NM008D-3D<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="m">20000588955136</span><span class="w"> </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">    </span>ZVT99QMH<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w">           </span>Disk<span class="w"> </span><span class="m">0</span><span class="w"> </span>on<span class="w"> </span>AHCI<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>SL<span class="w"> </span><span class="m">6</span><span class="w">            </span><span class="p">|</span><span class="w">  </span>MTFDDAV240TDU<span class="w">   </span><span class="p">|</span><span class="w">  </span><span class="m">240057409536</span><span class="w">  </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">  </span>22373BB1E0F8<span class="w">  </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w">           </span>Disk<span class="w"> </span><span class="m">1</span><span class="w"> </span>on<span class="w"> </span>AHCI<span class="w"> </span>Controller<span class="w"> </span><span class="k">in</span><span class="w"> </span>SL<span class="w"> </span><span class="m">6</span><span class="w">            </span><span class="p">|</span><span class="w">  </span>MTFDDAV240TDU<span class="w">   </span><span class="p">|</span><span class="w">  </span><span class="m">240057409536</span><span class="w">  </span><span class="p">|</span><span class="w">   </span>SATA<span class="w">   </span><span class="p">|</span><span class="w">  </span>22373BB1E0D5<span class="w">  </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span><span class="w"> </span>Enabled<span class="w"> </span><span class="p">|</span>
+------------+--------------------------------------------------------+------------------+----------------+----------+----------------+--------+---------+
</pre></div>
</div>
</section>
<section id="id7">
<h4>固件详情<a class="headerlink" href="#id7" title="Permalink to this heading"></a></h4>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># ceph orch hardware status node-10 --category firmwares</span>
+------------+----------------------------------------------------------------------------+--------------------------------------------------------------+----------------------+-------------+--------+
<span class="p">|</span><span class="w">    </span>HOST<span class="w">    </span><span class="p">|</span><span class="w">                                 </span>COMPONENT<span class="w">                                  </span><span class="p">|</span><span class="w">                             </span>NAME<span class="w">                             </span><span class="p">|</span><span class="w">         </span>DATE<span class="w">         </span><span class="p">|</span><span class="w">   </span>VERSION<span class="w">   </span><span class="p">|</span><span class="w"> </span>STATUS<span class="w"> </span><span class="p">|</span>
+------------+----------------------------------------------------------------------------+--------------------------------------------------------------+----------------------+-------------+--------+
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w">               </span>current-107649-7.03__raid.backplane.firmware.0<span class="w">               </span><span class="p">|</span><span class="w">                         </span>Backplane<span class="w"> </span><span class="m">0</span><span class="w">                          </span><span class="p">|</span><span class="w"> </span><span class="m">2022</span>-12-05T00:00:00Z<span class="w"> </span><span class="p">|</span><span class="w">     </span><span class="m">7</span>.03<span class="w">    </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span>


...<span class="w"> </span>omitted<span class="w"> </span>output<span class="w"> </span>...


<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w">               </span>previous-25227-6.10.30.20__idrac.embedded.1-1<span class="w">                </span><span class="p">|</span><span class="w">             </span>Integrated<span class="w"> </span>Remote<span class="w"> </span>Access<span class="w"> </span>Controller<span class="w">              </span><span class="p">|</span><span class="w">      </span><span class="m">00</span>:00:00Z<span class="w">       </span><span class="p">|</span><span class="w">  </span><span class="m">6</span>.10.30.20<span class="w"> </span><span class="p">|</span><span class="w">   </span>OK<span class="w">   </span><span class="p">|</span>
+------------+----------------------------------------------------------------------------+--------------------------------------------------------------+----------------------+-------------+--------+
</pre></div>
</div>
</section>
<section id="id8">
<h4>硬件严重警告报告<a class="headerlink" href="#id8" title="Permalink to this heading"></a></h4>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="c1"># ceph orch hardware status --category criticals</span>
+------------+-----------+------------+----------+-----------------+
<span class="p">|</span><span class="w">    </span>HOST<span class="w">    </span><span class="p">|</span><span class="w"> </span>COMPONENT<span class="w"> </span><span class="p">|</span><span class="w">    </span>NAME<span class="w">    </span><span class="p">|</span><span class="w">  </span>STATUS<span class="w">  </span><span class="p">|</span><span class="w">      </span>STATE<span class="w">      </span><span class="p">|</span>
+------------+-----------+------------+----------+-----------------+
<span class="p">|</span><span class="w">   </span>node-10<span class="w">  </span><span class="p">|</span><span class="w">   </span>power<span class="w">   </span><span class="p">|</span><span class="w"> </span>PS2<span class="w"> </span>Status<span class="w"> </span><span class="p">|</span><span class="w"> </span>critical<span class="w"> </span><span class="p">|</span><span class="w">    </span>unplugged<span class="w">    </span><span class="p">|</span>
+------------+-----------+------------+----------+-----------------+
</pre></div>
</div>
</section>
</section>
</section>
<section id="id9">
<h2>开发资料<a class="headerlink" href="#id9" title="Permalink to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">cephadm.agent.</span></span><span class="sig-name descname"><span class="pre">NodeProxyEndpoint</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mgr</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint" title="Permalink to this definition"></a></dt>
<dd></dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.__init__">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mgr</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.__init__" title="Permalink to this definition"></a></dt>
<dd></dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.oob">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">oob</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.oob" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.data">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">data</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.data" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.fullreport">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">fullreport</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.fullreport" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.summary">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">summary</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.summary" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.criticals">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">criticals</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.criticals" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.memory">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">memory</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.memory" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.storage">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">storage</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.storage" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.network">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">network</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.network" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.power">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">power</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.power" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.processors">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">processors</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.processors" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.fans">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">fans</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.fans" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.firmwares">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">firmwares</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.firmwares" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

<dl class="py method">
<dt class="sig sig-object py" id="cephadm.agent.NodeProxyEndpoint.led">
<span class="sig-prename descclassname"><span class="pre">NodeProxyEndpoint.</span></span><span class="sig-name descname"><span class="pre">led</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#cephadm.agent.NodeProxyEndpoint.led" title="Permalink to this definition"></a></dt>
<dd><p>Create a new <cite>Mock</cite> object. <cite>Mock</cite> takes several optional arguments
that specify the behaviour of the Mock object:</p>
<ul>
<li><p><cite>spec</cite>: This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods). Accessing
any attribute not in this list will raise an <cite>AttributeError</cite>.</p>
<p>If <cite>spec</cite> is an object (rather than a list of strings) then
<cite>mock.__class__</cite> returns the class of the spec object. This allows mocks
to pass <cite>isinstance</cite> tests.</p>
</li>
<li><p><cite>spec_set</cite>: A stricter variant of <cite>spec</cite>. If used, attempting to <em>set</em>
or get an attribute on the mock that isn’t on the object passed as
<cite>spec_set</cite> will raise an <cite>AttributeError</cite>.</p></li>
<li><p><cite>side_effect</cite>: A function to be called whenever the Mock is called. See
the <cite>side_effect</cite> attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns <cite>DEFAULT</cite>, the return
value of this function is used as the return value.</p>
<p>If <cite>side_effect</cite> is an iterable then each call to the mock will return
the next value from the iterable. If any of the members of the iterable
are exceptions they will be raised instead of returned.</p>
</li>
<li><p><cite>return_value</cite>: The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
<cite>return_value</cite> attribute.</p></li>
<li><p><cite>unsafe</cite>: By default, accessing any attribute whose name starts with
<em>assert</em>, <em>assret</em>, <em>asert</em>, <em>aseert</em>, or <em>assrt</em> raises an AttributeError.
Additionally, an AttributeError is raised when accessing
attributes that match the name of an assertion method without the prefix
<cite>assert_</cite>, e.g. accessing <cite>called_once</cite> instead of <cite>assert_called_once</cite>.
Passing <cite>unsafe=True</cite> will allow access to these attributes.</p></li>
<li><p><cite>wraps</cite>: Item for the mock object to wrap. If <cite>wraps</cite> is not None then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped object
(so attempting to access an attribute that doesn’t exist will raise an
<cite>AttributeError</cite>).</p>
<p>If the mock has an explicit <cite>return_value</cite> set then calls are not passed
to the wrapped object and the <cite>return_value</cite> is returned instead.</p>
</li>
<li><p><cite>name</cite>: If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.</p></li>
</ul>
<p>Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created.</p>
</dd></dl>

</section>
</section>



<div id="support-the-ceph-foundation" class="admonition note">
  <p class="first admonition-title">Brought to you by the Ceph Foundation</p>
  <p class="last">The Ceph Documentation is a community resource funded and hosted by the non-profit <a href="https://ceph.io/en/foundation/">Ceph Foundation</a>. If you would like to support this and our other efforts, please consider <a href="https://ceph.io/en/foundation/join/">joining now</a>.</p>
</div>


           </div>
           
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="../security/process/" class="btn btn-neutral float-left" title="Vulnerability Management Process" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="../glossary/" class="btn btn-neutral float-right" title="Ceph 术语" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 2016, Ceph authors and contributors. Licensed under Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0).</p>
  </div>

   

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>